package study.intconsulting.net.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import study.intconsulting.transform.Trans;
import study.intconsulting.vo.PcInfo;

public class IntServer implements Runnable{
 
 public static final int ServerPort = 9999;

 public void run(){
  try {
   System.out.println("Server Connecting...");
   ServerSocket serverSocket = new ServerSocket(ServerPort);
   while (true) {
    Socket socket = serverSocket.accept();
    try{
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

     // (1)
     // 스트림으로부터 읽기 준비가 정상적일 경우 반복하여 읽어들인다
     // readLine()은 라인종결자를 제외하고 읽으므로 마지막에 라인종결자 추가
//     while (in.ready()) {
//      str += in.readLine() + "\n";
//     }


     // (2)
     // 헤더부(첫번째 라인)의 송신 데이터 사이즈를 읽고,
     // 스트림으로부터 송신 데이터 사이즈 만큼의 읽기를 반복한다 
//     String sDataLen = in.readLine();
//     int iLen = sDataLen.length(); 
//     int iDataLen = Integer.valueOf(sDataLen);

//     String lineStr = "";
//
//     while (true) {
      // 스트림으로부터 한 줄씩 읽는다.
//      // readLine()은 라인종결자를 제외하고 읽으므로 마지막에 라인종결자 추가
//      lineStr = in.readLine() + "\n";
//      str += lineStr;
//      // 헤더부(첫번째 라인)의 사이즈와 비교하여 반복 읽기를 중단한다 
//      if (str.length() + iLen >= iDataLen)
//       break;
//     }


     // (3) 스트림의 종료문자로 null을 체크한 후, 반복문을 빠져나간다
     DataInputStream dI = new DataInputStream(socket.getInputStream());
     int len = 32;
     byte [] bbuf;
     int readLen = 0;
     int off = 0;

     while (true) {
      try {
       bbuf = new byte[len];
       readLen = dI.read(bbuf, off, len);

       // 읽어들인 데이터의 마지막 1바이트 임시 저장
       String tmpStr = new String(bbuf, readLen-1, 1).trim();

       if (tmpStr.equals("")) {
        // null문자 이전까지의 데이터 추가
        str += new String(bbuf).substring(0, readLen-2);
        break;
       }
       str += new String(bbuf);
      }
      catch (Exception e) {
       e.printStackTrace();
      }
     }


     System.out.println("Send Message ======> " + str + "\n");

     // 서버의 ip와 name을 넣은 vo로 service호출
     PcInfo pcInfo = new PcInfo();
     
     String hostName = InetAddress.getLocalHost().getHostName();
     String hostAddress = InetAddress.getLocalHost().getHostAddress();

     // 메시지변환
     Trans trans = new Trans();
     pcInfo = trans.makePcInfo(str);
     
     pcInfo.setIp(hostAddress);
     pcInfo.setName(hostName);
     
     // 서비스호출..
//     dataWrite(pcInfo);
     
     // 수신 메시지 생성
     String xml = trans.makeXML(pcInfo);
     System.out.println("xml : " + xml);
     
//     DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//     dos.writeBytes(xml + '\n');
//     dos.flush();
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
     bw.write(xml + "\n");
     bw.flush();
    }catch (Exception e){
     e.printStackTrace();
    }finally{
     socket.close();
     System.out.println("Server Done.");
    }
   }
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 
 public static void main(String[] args) {
  // TODO Auto-generated method stub         
  Thread thread = new Thread(new IntServer());
  thread.start();
 }
}

 

 
